package com.example.video.conf;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;

import static org.springframework.security.config.Customizer.withDefaults;

@Configuration//配置类
//@EnableWebSecurity//开启SpringSecurity的自定义配置(在springboot项目中，可以省略此注解)
@EnableMethodSecurity//开启基于方法的授权
public class WebSecurityConfig {
    //        @Bean
//    public UserDetailsService userDetailsService() {
//        //创建基于内存的用户信息管理器
//        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
//        //创建UserDetails对象，用于管理用户名、密码、角色和权限等内容
//        manager.createUser(User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build());
//        return manager;
//    }
//    @Bean
//    public UserDetailsService userDetailsService() {
//        //创建基于数据库的用户信息管理器
//        DBUserDetailsManager manager = new DBUserDetailsManager();
//        return manager;
//    }
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {


        //开启授权保护
        http
//                        .securityMatcher("/api/**")
                .authorizeRequests(authorize -> authorize
                                //无需授权即可访问此路径的资源
                                .requestMatchers("/api/**","/device/**","/upload/**","/test/**","/node_modules/**","/img/**").permitAll()

                                .requestMatchers("/css/**","/js/**","/img/**").permitAll()
                                //针对特定路径的资源，需要具有USER_LIST权限
//                        .requestMatchers("/user/test").hasAuthority("USER_LIST")
                                //针对特定路径的资源，需要具有ADMIN角色
//                        .requestMatchers("/admin/**","/account/**","/api/**","/device/**","/outerAcount/**","/platform/**","/video/**","/videoLog/**").hasRole("ADMIN")
                                //对所有请求进行身份验证
                                .anyRequest()
                                //已认证的用户会被自动授权
                                .authenticated()


                );
        //登录配置
        http.formLogin(form ->{
            form
                    .loginPage("/login").permitAll()//无需授权即可访问当前页面
//                            .usernameParameter("username")//指定用户名参数
//                            .passwordParameter("password")//指定密码参数
                    .defaultSuccessUrl("/admin/index")//登录成功后跳转到主页
                    .failureUrl("/login?error")//登录失败后跳转到登录页面
//                            .successHandler(new MyAuthenticationSuccessHandler())//认证成功时的处理
//                    .failureHandler(new MyAuthenticationFailureHandler()) //认证失败时的处理

            ;
        });//使用表单授权方式
        //登出配置
        http.logout(logout -> {
           logout.logoutSuccessUrl("/login");//注销成功时的处理
        });
        //错误处理
        http.exceptionHandling(exception  -> {
            exception.accessDeniedPage("/403");
//            exception.authenticationEntryPoint(new MyAuthenticationEntryPoint());//登录拦截
//            exception.accessDeniedHandler(new MyAccessDeniedHandler());//请求未认证的接口
        });
        //跨域
        http.cors(withDefaults());
        //安全HTTP响应头,允许iframe嵌套
        http.headers(
                headers -> headers.frameOptions(frameOptions ->frameOptions.sameOrigin())
        );

        //.httpBasic(withDefaults());//使用基本授权方式（浏览器弹窗登录）
        //关闭csrf攻击防御
        http.csrf(csrf -> csrf.disable());
        return http.build();
    }
    /**
     * 配置全局的某些通用事物，例如静态资源等
     * @return
     */
    @Bean
    public WebSecurityCustomizer securityCustomizer() {
        return (web) -> web.ignoring()
                .requestMatchers("resource/**")
                .requestMatchers("/static/**");
    }
    /**
     * 配置密码编码器。
     *
     * 本方法通过实例化一个BCryptPasswordEncoder对象来提供密码编码服务。BCryptPasswordEncoder是一种基于bcrypt算法的密码编码器，
     * 它用于将用户密码加密为安全的hash值，以保护密码不被未授权访问。在Spring Security中，PasswordEncoder接口的实现用于验证用户输入的密码
     * 是否与存储的hash密码匹配。
     *author: ayan
     * @return 返回一个新的BCryptPasswordEncoder实例，用于对用户密码进行编码。
     */
//    @Bean
//    public PasswordEncoder passwordEncoder() {
//        return new BCryptPasswordEncoder();
//    }


}
